package com.lazily.string_;


/**
 * @Author:  GZQ
 * @date:  2025/3/9 21:26
 * @description: 字符串特性说明 -- 练习1
 */

public class StringExercise05 {
	// 程序入口
	public static void main(String[] args) {
		/*
		1. String 是一个final类, 代表不可变的字符序列
		2. 字符串是不可变的。一个字符串对象一旦被分配, 其内容是不可变的。
		 */
		String s1 = "hello";
		s1 = "world";
		// 上面代码创建了两个对象


		String a = "hello" + "abc";
		// 创建了一个对象
		// String a = "hello" + "abc"; ===> 优化等价 String a = "helloabc";
		// 编译器不傻, 做了一个优化, 判断创建的常量池对象，是否有引用指向



		String b = "hello"; // 创建 b 对象
		String c = "abc"; // 创建 c 对象
		// 1. 先创建一个 StringBuilder sb = StringBuilder()
		// 2. 执行 sb.append("hello");
		// 3. sb.append("abc");
		// 4. String d = sb.toString
		// 最后其实是 d 指向堆中的对象(String) value[] -> 池中 "helloabc"
		String d = b + c;
		String e = "helloabc";
		System.out.println(d == e); // f
		String f = "hello" + "abc"; // 看的是池, f指向常量池
		System.out.println(e == f); // t


		// 	小结：
		// 	底层是 StringBuilder sb=new StringBuilder();sb.append(a);
		// 	sb.append(b);sb是在堆中，并且append是在原来字符串的基础上追加的.
		//  重要规则: String c1 ="ab"+“cd";常量相加，看的是池。
		//  String c1 =a+b;变量相加,是在堆中.
	}
}
